package common.model.Entity.bankEntity;

import common.model.Entity.BaseEntity;

import lombok.Getter;
import lombok.Setter;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 表示银行账户的实体类，继承自 {@link BaseEntity}。
 * <p>
 * 包含账户 ID、用户 ID、账户名、余额、存款限制、状态以及创建/更新时间等信息。
 * </p>
 */
@Getter
@Setter
public class Account extends BaseEntity {
    /**
     * 账户唯一标识符
     */
    private Long id;

    /**
     * 账户所属用户的 ID
     */
    private Long userId;

    /**
     * 账户名称
     */
    private String accountName;

    /**
     * 账户余额
     */
    private BigDecimal balance;

    /**
     * 单次最大存款限制，默认值为 5000.00
     */
    private BigDecimal limit = new BigDecimal(5000.00);

    /**
     * 账户状态，1 表示启用，0 表示停用
     */
    private Integer status;

    /**
     * 账户创建时间
     */
    private LocalDateTime createdAt;

    /**
     * 账户最近更新时间
     */
    private LocalDateTime updatedAt;

    /**
     * 默认构造方法。
     * <p>初始化时：余额为 0，最大存款限制为 5000.00，状态为启用（1）。</p>
     */
    public Account() {
        this.limit = new BigDecimal(5000.00);
        this.balance = BigDecimal.ZERO;
        this.status = 1;
    }

    /**
     * 全参数构造方法。
     *
     * @param id              账户 ID
     * @param userId          用户 ID
     * @param accountName     账户名称
     * @param balance         账户余额
     * @param maxDepositLimit 最大存款限制
     * @param status          账户状态
     * @param createdAt       创建时间
     * @param updatedAt       更新时间
     */
    public Account(Long id, Long userId, String accountName, BigDecimal balance, BigDecimal maxDepositLimit,
                   Integer status, LocalDateTime createdAt, LocalDateTime updatedAt) {
        this.id = id;
        this.userId = userId;
        this.accountName = accountName;
        this.balance = balance;
        this.limit = maxDepositLimit;
        this.status = status;
        this.createdAt = createdAt;
        this.updatedAt = updatedAt;
    }

    /**
     * 返回账户的字符串表示形式，包含用户 ID、账户名、余额、限制、状态和更新时间等。
     *
     * @return 账户信息的字符串
     */
    @Override
    public String toString() {
        return "User{" +
                "userId=" + getUserId() + '\'' +
                ", accountName='" + getAccountName() + '\'' +
                ", balance=" + getBalance() +
                ", limit=" + getLimit() +
                ", status=" + getStatus() +
                ", updatedAt=" + getUpdatedAt() +
                '}';
    }
}


